當我們在做 RAG 的時候,要能找到使用者問題和正確的參考知識,靠的是 語意搜尋 (semantic search)。這背後的關鍵,就是把文字轉換成向量,將語意映射到高維空間,才能透過相似度搜尋來找到最相關的答案。
而這個把文字映射成向量的模型,就是 Embedding model。
不同的 embedding 模型是靠 不同的 tokenizer 與語料 訓練而成,因此挑選正確的模型很重要。例如:
此外,Embedding 的檢索品質還取決於以下幾個因素:
Pooling較為複雜,我請Claude幫忙整理一張表格,希望能幫助讀者快速釐清差異。
比較維度 | Mean Pooling | CLS Token Pooling | Last Token Pooling |
---|---|---|---|
工作原理 | 對所有token hidden states取平均 | 使用[CLS] token的表示 | 使用序列最後一個token表示 |
語義保留 | 完整保留全文信息 | 整合全局語義 | 主要反映後半段信息 |
計算效率 | 需要平均計算 | 直接提取最快 | 直接提取最快 |
長文檔表現 | ✅ 優秀,信息不丟失 | ✅ 良好,依賴預訓練品質 | ❌ 前段信息容易丟失 |
短文檔表現 | ✅ 優秀 | ✅ 優秀 | ⚠️ 尚可 |
模型適用性 | 🌍 通用於所有encoder模型 | 🎯 專用於BERT系列 | 🔄 適合decoder-only模型 |
RAG適用性 | ⭐⭐⭐⭐⭐ 首選 | ⭐⭐⭐⭐ 次選 | ⭐⭐ 特殊場景 |
典型應用 | Sentence-BERT, BGE, E5 | BERT, RoBERTa | GPT, Llama embedding |
主要優點 | • 語義完整• 穩定可靠• 長度不敏感 | • 計算最快• 全局整合• 預訓練優化 | • 計算簡單• 適合生成模型• 位置信息強 |
主要缺點 | • 可能稀釋重要信息• 需額外計算 | • 依賴模型品質• 需特殊token | • 信息丟失嚴重• 檢索效果差 |
多數 Embedding 模型屬於 Encoder-only (BERT family),這類架構最適合產生密集向量。
第一步通常是 tokenizer,因為不同的 tokenizer 決定了文本如何被拆解為 token → 最後影響檢索效果。
要在地端執行,一般可以使用 SentenceTransformers 套件來安裝,如果遇到困難,也可以到Huggingface上去直接把Embedding 模型下載下來後使用,假設我們要使用BAAI/bge-m3這顆embedding,我們可以到Huggineface-BGE-m3的首頁,點選Filse and Version如下圖:
下載裡面的結構包含以下:
1_Pooling
config.json
modules.json
pytorch_model.bin
special_tokens_map.json
tokenizer.json
tokenizer_config.json
這些結構裡面涵蓋了模型維度、pooling 策略、tokenizer 規則等關鍵資訊。
筆者建議至少可以透過 SentenceTransformers 套件解析模型,快速理解模型設定。
我們就利用SentenceTransformers 套件來解析模型給大家做參考,我們選擇 BGE-M3(大型、多語言、長文本)與 all-MiniLM-L6-v2(輕量、英文短文本)。
語法如下
# 記得要先install
# 匯入 SentenceTransformer 套件
from sentence_transformers import SentenceTransformer
# 載入 embedding 模型
# - 如果要用 all-MiniLM-L6-v2: "all-MiniLM-L6-v2"
# - 如果要用 BGE-m3: "BAAI/bge-m3"
model = SentenceTransformer("all-MiniLM-L6-v2")
# 檢查模型的基本架構
# 會顯示 Transformer backbone, Pooling 層, Normalization 層等資訊
print(model)
# 取得模型的第一個模組 (通常是 Transformer 本體)
first_module = model._first_module()
# 進一步查看 Transformer 的 embedding 層
# - word_embeddings: 詞嵌入矩陣 (詞彙表大小 x 向量維度)
# - position_embeddings: 位置嵌入,用來表示 token 在句子中的位置
# - token_type_embeddings: 區分不同句子 (如句子 A / 句子 B),部分模型會使用
# - LayerNorm: 正規化層,幫助訓練穩定
# - dropout: 防止過擬合
embeddings = first_module.auto_model.embeddings
embeddings
以下整理兩者的細節:
[CLS] token
向量特徵 | BGE-M3 | all-MiniLM-L6-v2 |
---|---|---|
Backbone | XLM-Roberta | BertModel (MiniLM) |
最大序列長度 | 8192 | 256 |
嵌入維度 | 1024 | 384 |
詞彙表大小 | 250k+ | 30k+ |
Pooling 策略 | CLS Token | Mean Pooling |
Normalization | L2 | L2 |
多語言支援 | ✅ | ❌ |
適合場景 | 長文件、多語言、企業級應用 | 短文本、英文、輕量應用 |
👉 總結來說:
在繁體中文的應用場景,建議選擇 支援多語言 的 embedding 模型:
有興趣的朋友可以參考ihower大大的使用繁體中文評測各家 Embedding 模型的檢索能力
👉 下一篇將介紹 向量資料庫 (Vector Database),筆者整理一些現行流行的向量資料庫做比較討論。